JVM不仅是大厂面试的一个高频问题,也是Java程序员跨入高职级必须掌握的知识点,垃圾回收器作为JVM中核心的一环,了解它的原理,可以帮助我们更好地调优和故障排除,因此,今天我们就来聊聊JVM中9款常见的垃圾回收器。背景 因为Java虚拟机的类型比较多,如果没有特殊说明,本文特指HotSpot虚拟机,在分享回收器之前,我们首先对HotSpot虚拟机背景做个简单的介绍。HotSpotVM,最初是由“LongviewTechnologies”这家小公司设计,并且一开始也不是为Java语言研发。1997年,Sun公司收购了这家公司,从而也就得到了HotSpot虚拟机,在Sun公司的一番优化下,Hot
如果幸运的话,其中一些类会实现AutoClosable但有时你只需要小心并检查现有的方法,就会注意到有一个close、destroy或shutdown方法(或任何其他方法)作者决定给它命名)。这是Java中资源泄漏的主要来源。我和一位同事讨论过这个问题,我也想知道:为什么这不能以某种方式自动化?理论上你可以对这种情况使用finalize,但它是notrecommended.那么为什么没有办法只使用其中一些可关闭的资源并让GC在实例不再可用时自动关闭它们而不必记住明确编写一些close处理代码(如try...)?这是因为在GC启动之前系统可能资源匮乏(文件描述符,...)?注意:我尽可能
我很想知道最新的JVM如何处理通过以下方法保留的垃圾回收内存。publicListgetHallOfFame(){ArrayListlistToSort=newArrayList(map.values());Collections.sort(listToSort,comparator);returnlistToSort.subList(0,5);}在最坏的情况下,我可以想象JVM将listToSort的全部内容保存在内存中,只要保留对子列表的引用即可。有谁知道事实是否如此?我对可以针对特定JVM以一种或另一种方式证明这一点的链接特别感兴趣。 最佳答案
我在面试中被问到以下问题:“垃圾收集线程的默认优先级是多少?”我知道我们不能强制GC或更改其优先级,但我从未听说过它的默认优先级。有人知道吗? 最佳答案 可能面试官正在寻找的答案是GC处于低优先级的后台进程。这样做的原因是运行GC是昂贵的,但它不是(通常)关键进程,所以它应该只在系统有时间做而不是中断关键任务时进行。(实时系统中也存在类似的想法——将不重要的进程放在后台任务中,将所有关键进程放在前台——所有这些都将比后台任务具有更高的优先级。)话虽如此,如果您阅读Sun有关垃圾收集的文献,就会发现仅将GC作为低优先级线程运行是完全不
是否可以从gc角度将java对象标记为不可回收以节省gc-sweep时间?类似于http://wwwasd.web.cern.ch/wwwasd/lhc++/Objectivity/V5.2/Java/guide/jgdStorage.fm.html的内容特别是non-garbage-collectible容器那里(non-garbage-collectable?)。问题是我有很多普通的临时对象,但我有更大(几千兆)的对象存储用于缓存目的。JavaGC无缘无故应该遍历所有这些缓存千兆字节以试图找到任何要收集的东西,因为它们包含有自己的超时的缓存数据。这样我就可以以自定义方式将我的数据划
传统的C/C++等编程语言,需要程序员负责回收已经分配的内存。显示进行垃圾回收是一件比较困难的事情,因为程序员并不总是知道内存应该何时被释放。如果一些分配出去的内存得不及时回收,就会引起系统运行速度下降,甚至导致程序瘫痪,这种现象被称为内存泄漏。总体而言,显示进行垃圾回收主要有如下两个缺点: 1.程序忘记及时回收无用内存,从而导致内存泄漏,降低系统性能。 2.程序错误地回收程序核心类库地内存,从而导致系统崩溃。 与C/C++程序不同,Java语言不需要程序员直接控制内存回收,Java程序的内存分配和回收都是由JRE(JAVA运行时环境)在后台自动进行的。JRE会负责回收那些不
出乎我的意料,下面的程序importjava.lang.ref.WeakReference;importjava.util.Arrays;importjava.util.List;publicclassStackTest{publicstaticvoidmain(String[]args){Objectobject1=newObject();Objectobject2=newObject();Listobjects=Arrays.asList(object1,object2);WeakReferenceref1=newWeakReference(object1);WeakReferen
我正在运行JVM1.5.0(MacOSX默认值),并且正在Activity监视器中监视我的Java程序。我有以下内容:importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.util.ArrayList;importjava.util.Date;publicclassMemoryTest{publicstaticvoidmemoryUsage(){System.out.println(Runtime.getRuntime().totalMemory
我需要帮助了解我如何从jmap获得与GC相关的数字和jstat与我传递给java的设置有关。我在具有16GB内存的服务器上使用以下设置启动应用程序(solr):-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:+CMSParallelRemarkEnabled-Xms12144m-Xmx12144m-XX:NewRatio=4-XX:SurvivorRatio=8-XX:+UseCompressedOopsjmap的输出开始:ConcurrentMark-SweepGCHeapConfiguration:MinHeapFreeRatio=40MaxH
我想知道两者之间有什么区别或者是否相同。 最佳答案 这个问题无法回答。首先,没有任何相关规范会说明Java或.net应如何实现垃圾回收。所以在Java或.net中实际上没有“完成GC的方式”。其次,Java和.net的各个供应商之间的GC实现细节各不相同,对于任何供应商,GC可能会随着每个平台、每个主要版本、次要版本甚至每个补丁版本而变化。最重要的是,Java的某些实现允许您使用命令行选项在不同的垃圾收集器之间进行选择。最后,在Java或.net实现中如何实现GC并不重要提供它可以按应用程序的要求工作。对于Java,答案是它可以用于